/*================================================================
*   Copyright (C) 2023 baichao All rights reserved.
*   
*   文件名称：proc.c
*   创 建 者：baichao
*   创建日期：2023年10月14日
*   描    述：
*
================================================================*/

#include <unistd.h>
#include <stdio.h>

/*
 * $ ./a.out 
 *  start, curr data sec end pos: 0xb95000
 *  add1, curr data sec end pos: 0xb95000
 *  add2, curr data sec end pos: 0x6f95000
 *  sub1, curr data sec end pos: 0x6f95000
 *  sub2, curr data sec end pos: 0xa195000
 *  pid:110074
 * $ cat /proc/110074/maps
 *  00400000-00401000 r-xp 00000000 fd:02 102326890                          /home/baichao/code/c++/cpp_test/sys_call/sbrk/a.out
 *  00600000-00601000 r--p 00000000 fd:02 102326890                          /home/baichao/code/c++/cpp_test/sys_call/sbrk/a.out
 *  00601000-00602000 rw-p 00001000 fd:02 102326890                          /home/baichao/code/c++/cpp_test/sys_call/sbrk/a.out
 *  00b95000-0a195000 rw-p 00000000 00:00 0                                  [heap]
 *  7efc6bf6a000-7efc6c12e000 r-xp 00000000 fd:00 33648183                   /usr/lib64/libc-2.17.so
 *  7efc6c12e000-7efc6c32d000 ---p 001c4000 fd:00 33648183                   /usr/lib64/libc-2.17.so
 *  7efc6c32d000-7efc6c331000 r--p 001c3000 fd:00 33648183                   /usr/lib64/libc-2.17.so
 *  7efc6c331000-7efc6c333000 rw-p 001c7000 fd:00 33648183                   /usr/lib64/libc-2.17.so
 *  7efc6c333000-7efc6c338000 rw-p 00000000 00:00 0 
 *  7efc6c338000-7efc6c35a000 r-xp 00000000 fd:00 33725688                   /usr/lib64/ld-2.17.so
 *  7efc6c546000-7efc6c549000 rw-p 00000000 00:00 0 
 *  7efc6c557000-7efc6c559000 rw-p 00000000 00:00 0 
 *  7efc6c559000-7efc6c55a000 r--p 00021000 fd:00 33725688                   /usr/lib64/ld-2.17.so
 *  7efc6c55a000-7efc6c55b000 rw-p 00022000 fd:00 33725688                   /usr/lib64/ld-2.17.so
 *  7efc6c55b000-7efc6c55c000 rw-p 00000000 00:00 0 
 *  7ffc13434000-7ffc13455000 rw-p 00000000 00:00 0                          [stack]
 *  7ffc134ec000-7ffc134ee000 r-xp 00000000 00:00 0                          [vdso]
 *  ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
 * 
 * `00b95000-0a195000 rw-p 00000000 00:00 0 [heap]` 描述了进程的堆区域内存映射信息，其字段含义如下：
 *    00b95000-0a195000: 堆区域的起始地址和结束地址，以16进制表示。
 *    rw-p: 权限标志，表示该区域可读、可写，但不可执行。
 *    00000000: 偏移量，表示该区域在文件中的偏移量，通常为 0。
 *    00:00: 对应的设备号和节点号，表示该段映射不对应于任何文件或设备。
 *    0: 文件系统上的实际文件大小，通常为 0。
 *    [heap]: 映射区域的名字，表示该区域是进程的堆区域。

该行描述了堆区域的内存映射信息，其起始地址为 `0x00b95000`，结束地址为 `0x0a195000`，共占用了 `0x0a195000 - 0x00b95000 = 0x099fb000`（约为 160 MB）的虚拟内存空间。权限标志为 `rw-p`，表示该区域可读可写，但不可执行。由于堆区域不对应于任何文件或设备，因此设备号和节点号都为 0。文件系统上的实际文件大小为 0。最后，`[heap]` 标记说明该区域是进程的堆区域。
 */

int main() {
    void *cur_brk;

    // 获取当前程序数据段结束地址
    cur_brk = sbrk(0);
    printf("start, curr data sec end pos: %p\n", cur_brk);

    // 增加堆的大小
    long delta = 100*1024*1024;
    cur_brk = sbrk(delta); // 堆增长delta, 此时的返回值cur_brk是增加前的地址
    printf("add1, curr data sec end pos: %p\n", cur_brk);
    cur_brk = sbrk(0);
    printf("add2, curr data sec end pos: %p\n", cur_brk);

    // 减小堆的大小
    delta = 50*1024*1024;
    cur_brk = sbrk(delta); // 堆缩小delta，同理，此时的返回值cur_brk是减小前的地址
    printf("sub1, curr data sec end pos: %p\n", cur_brk);
    cur_brk = sbrk(0);
    printf("sub2, curr data sec end pos: %p\n", cur_brk);

    printf("pid:%d\n",getpid());
    
    while(1);  //为了阻塞住，然后去查看/proc/${pid}/maps，里面有堆的结束地址。

    return 0;
}

